﻿// -------------------------------------------------------------------------
//    @FileName         :    NFBagPageGrid.h
//    @Author           :    gaoyi
//    @Date             :    2024/12/20
//    @Email            :    445267987@qq.com
//    @Module           :    NFBagPageGrid
//
// -------------------------------------------------------------------------

// --- 文件总结 ---------------------------------------------------------------
// `NFBagPageGrid` 表示单个背包格子：
// - 持有格子物品、副本（提交前快照）与格子索引、操作类型
// - 提供基础数量增减与设置、提交前保存、标记操作类型
// ---------------------------------------------------------------------------

#pragma once

#include <NFLogicCommon/NFItemDefine.h>
#include "NFBagPageOpDefine.h"

/**
 * @brief 背包格子类
 * 表示单个背包格子，持有格子物品、副本（提交前快照）与格子索引、操作类型
 */
class NFBagPageGrid
{
public:
    /**
     * @brief 构造函数
     */
    NFBagPageGrid()
    {
        m_iGridIndex = INVALID_ID;
        m_enGridOpType = EN_BAG_GRID_OP_TYPE_NULL;
    }

    /**
     * @brief 析构函数
     */
    virtual ~NFBagPageGrid()
    {
    }

public:
    /**
     * @brief 获取物品引用
     * @return 物品引用
     */
    NFGridItem& GetItem() { return m_stItem; }
    
    /**
     * @brief 获取物品引用（const版本）
     * @return 物品引用
     */
    const NFGridItem& GetItem() const { return m_stItem; }
    
    /**
     * @brief 获取提交前的物品（快照）
     * @return 提交前物品引用
     */
    const NFGridItem& GetCommitBeforeItem() const { return m_stCommitBeforeItem; }

public:
    /**
     * @brief 获取格子索引
     * @return 格子索引
     */
    int GetGridIndex() const { return m_iGridIndex; }
    
    /**
     * @brief 获取物品数量
     * @return 物品数量
     */
    int GetNumber() const { return m_stItem.GetNumber(); }

    /**
     * @brief 获取物品UUID
     * @return 物品UUID
     */
    uint64_t GetUUID() const { return m_stItem.GetUUID(); }
    
    /**
     * @brief 获取物品ID
     * @return 物品ID
     */
    uint32_t GetItemID() const { return m_stItem.GetItemID(); }
    
    /**
     * @brief 获取格子操作类型
     * @return 格子操作类型
     */
    EN_BAG_GRID_OP_TYPE GetGridOpType() const { return m_enGridOpType; }

public:
    /**
     * @brief 是否已提交
     * @return true已提交，false未提交
     */
    bool IsCommit() const { return m_enGridOpType != EN_BAG_GRID_OP_TYPE_NULL; }

public:
    /**
     * @brief 减少物品数量
     * @param iWantDecNum 期望减少数量
     * @param pRealDecNum 输出实际减少数量（=NULL 全部减少，!=NULL 尽量减少）
     * @return 0成功，非0失败
     */
    int DecNumber(int iWantDecNum, int* pRealDecNum = NULL);
    
    /**
     * @brief 设置物品数量
     * @param iNum 要设置的数量
     * @param iRealNum 输出实际设置的数量
     * @return 0成功，非0失败
     */
    int SetNumber(int iNum, int& iRealNum);
    
    /**
     * @brief 设置格子索引
     * @param iGridIndex 格子索引
     * @return 0成功，非0失败
     */
    int SetGridIndex(int iGridIndex);

public:
    /**
     * @brief 设置提交前的物品（保存快照）
     * @param stOriginWare 原始物品
     * @return 0成功，非0失败
     */
    int SetCommitBeforeWare(const NFGridItem& stOriginWare);

    /**
     * @brief 设置格子操作类型
     * @param enGridOpType 格子操作类型
     */
    void SetGridOpType(EN_BAG_GRID_OP_TYPE const enGridOpType) { m_enGridOpType = enGridOpType; }

protected:
    /** @brief 格子物品 */
    NFGridItem m_stItem;
    /** @brief 格子索引 */
    int m_iGridIndex;
    /** @brief 提交前的物品（快照） */
    NFGridItem m_stCommitBeforeItem;
    /** @brief 格子操作类型 */
    EN_BAG_GRID_OP_TYPE m_enGridOpType;
};

inline int NFBagPageGrid::SetCommitBeforeWare(const NFGridItem& stOriginWare)
{
    m_stCommitBeforeItem = stOriginWare;
    return 0;
}



